package fr.lip6.move.care

import sdmakerz_v1.coresyntax.generator.interfaces.IContext
import sdmakerz_v1.coresyntax.sDMakerV1.Call
import sdmakerz_v1.coresyntax.generator.SDMakerV1IDProvider

class CareCallGen {	
	private CareGen mainGenerator;
	
	new(CareGen mainGenerator){
		this.mainGenerator= mainGenerator;
	}
	
	def public
	CompileResult compile(IContext context, Call call){
		
		var java.util.ArrayList<CompileResult> nestedResults=
			 new java.util.ArrayList<CompileResult>()
		var CompileResult compRes
        var callID= call.name+"_id"+SDMakerV1IDProvider::computeID
        var callerName= context.getDiagramRefData.getNewName(call.caller);
        var calledName= context.getDiagramRefData.getNewName(call.called);
        
        var CharSequence charSequenceResult=
        '''
    
        «FOR elt: call.nested_calls»
        «SDMakerToCareUtils::toNullExp(
        	compRes= mainGenerator.compile(context, elt))»
        «SDMakerToCareUtils::toNullExp(nestedResults.add(compRes))» 
        «ENDFOR»
    
        «IF nestedResults.size() == 0»
        Call «callID» = new Call(new Statement("S" + i++,«callerName»,new Method("«call.name»",new ArrayList<ObjectInstance>(),«context.getInterfaceDataByObjectName(calledName).interfaceID»),«calledName»));        
        «ELSEIF nestedResults.size() == 1»
        /* NESTED CALL: «callID» */
        «nestedResults.get(0).charSequenceResult»
        /* FINALIZING «callID»*/
        Call «callID» = new Call(new Statement("S" + i++,«callerName»,new Method("«call.name»",new ArrayList<ObjectInstance>(),«context.getInterfaceDataByObjectName(calledName).interfaceID»),«calledName»), «nestedResults.get(0).eltID»);
        «ELSE»
        /* NESTED CALL: «callID» */
        BlockList bloc_«callID»= new BlockList();
        «FOR nestedResult: nestedResults»
        «nestedResult.charSequenceResult»
        «ENDFOR»
    
        /* add(s) for «callID» */
        «FOR nestedResult: nestedResults»
        bloc_«callID».add(«nestedResult.eltID»);
        «ENDFOR»
    
        /* FINALIZING «callID»*/
        Call «callID» = new Call(new Statement("S" + i++,«callerName»,new Method("«call.name»",new ArrayList<ObjectInstance>(),«context.getInterfaceDataByObjectName(calledName).interfaceID»),«calledName»), bloc_«callID»);
        «ENDIF»
        '''
    
    
        return new CompileResult(
    				charSequenceResult,
    				callID,
    				true)
	}
}